package main_package;
import correo.EnviarMail;
import interfaz.VentanaAdjunto;
import interfaz.VentanaExperto;
import interfaz.VentanaSecretario;
import java.beans.Statement;

import java.sql.*;
import java.util.Calendar;
import utilidades.leer;
import java.util.Vector;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JOptionPane;



public class Usuario {
    private String dni;
    private String apellidos;
    private String nombre;
    private String correo;
    private int telefono;
    private String fecha_nacimiento;
    private String sexo;
    private String direccion;
    private String estado_civil;
    private String universidad;
    private String estudios;
    private String entidad_bancaria;
    private int numero_cuenta;
    private String login;
    private String password;
    private String rol;
    private Consultas consultas;
    private VentanaSecretario ventSecretario;
    private VentanaAdjunto ventAdjunto;
    private VentanaExperto ventExperto;
    private int nota;
    private String palabras;
    
    public Usuario(){
        
    }
        
    public Usuario(String dni, Consultas cons) throws SQLException {            
        consultas=cons;        
        this.dni=dni;
        apellidos=null;
        nombre=null;
        correo= null;
        telefono=0;
        fecha_nacimiento= null;
        sexo= null;
        direccion= null;
        estado_civil= null;
        universidad= null;
        estudios= null;
        entidad_bancaria= null;
        numero_cuenta=0;            
        password= null;
        rol= null;
    }
        	
    public Usuario(String a, String b, String c, String d, int t, String fech, 
            String sex, String dir, String civ, String uni, String est, 
            String ent, int num, String p1, String p2, String rol) {
            dni=a;
            apellidos=b;
            nombre=c;
            correo= d;
            telefono=t;
            fecha_nacimiento=fech;
            sexo=sex;
            direccion=dir;
            estado_civil=civ;
            universidad=uni;
            estudios=est;
            entidad_bancaria=ent;
            numero_cuenta=num;
            login= p1;
            password= p2;
            this.rol=rol;
    }

    public String getdni() {
            return dni;
    }

    public String getapellidos() {
            return apellidos;
    }

    public String getnombre() {
            return nombre;
    }

    public String getcorreo() {
            return correo;
    }

    public int gettelefono() {
            return telefono;
    }

    public String getfecha_nacimiento() {
            return fecha_nacimiento;
    }

    public String getsexo() {
            return sexo;
    }

    public String getdireccion() {
            return direccion;
    }

    public String getestado_civil() {
            return estado_civil;
    }

    public String getuniversidad() {
            return universidad;
    }

    public String getestudios() {
            return estudios;
    }

    public String getentidad_bancaria() {
            return entidad_bancaria;
    }

    public int getnumero_cuenta() {
            return numero_cuenta;
    }

    public String getlogin() {
            return login;
    }

    public String getpassword() {
            return password;
    }

    public String rol() {
            return rol;
    }

    public void setapellidos(String ap) {
            apellidos=ap;
    }

    public void setnombre(String nom) {
            nombre=nom;
    }

    public void setcorreo(String cor) {
            correo=cor;
    }

    public void settelefono(int tel) {
            telefono=tel;
    }

    public void setfecha_nacimiento(String fech) {
            fecha_nacimiento=fech;
    }

    public void setsexo(String sex) {
            sexo=sex;
    }

    public void setdireccion(String dir) {
            direccion=dir;
    }

    public void setestado_civil(String est) {
            estado_civil=est;
    }

    public void setuniversidad(String uni) {
            universidad=uni;
    }

    public void setestudios(String est) {
            estudios=est;
    }

    public void setentidad_bancaria(String ent) {
            entidad_bancaria=ent;
    }

    public void setnumero_cuenta(int num) {
            numero_cuenta=num;
    }

    public void setlogin(String log) {
            login=log;
    }

    public void setpassword(String pass) {
            password=pass;
    }

    public void setRol(String rol) {
            this.rol=rol;
    }

    public void runSecretario() throws Exception {
        ventSecretario = new VentanaSecretario(this);       
        synchronized(ventSecretario){
            ventSecretario.wait();
        }
        ventSecretario.dispose();
    }
    
    public void runExperto() throws Exception {
        ventExperto = new VentanaExperto(this);       
        synchronized(ventExperto){
            ventExperto.wait();
        }
        ventExperto.dispose();
    }
    
    public void runAdjunto() throws InterruptedException {
        ventAdjunto = new VentanaAdjunto(this);       
        synchronized(ventAdjunto){
            ventAdjunto.wait();
        }
        ventAdjunto.dispose();
        //Realiza informe final
            //Consultar proyectos
            //Consulta parciales
                //Reutiliza
            //Evaluar
        //Busca expertos
            //Consultar proyectos
            //Invitar expertos
        cambiarDatos();
    }
    
    public void runCoordinador() throws Exception {
        int eleccion=leer.entero("ACCION COORDINADOR:");
        switch(eleccion){
            case 1: Asignar_adjuntos();break;
            case 2: Consultar_proyectos();break;
            case 3: Revisar_informe_final();break;
        }
        //
        cambiarDatos();
    }

    public void agregarUsuario() throws Exception {
        String dni = ventSecretario.getNU_dni();
        Usuario nuevoUsuario = new Usuario(dni, consultas);

        nuevoUsuario.setnombre(ventSecretario.getNU_nombre());
        nuevoUsuario.setapellidos(ventSecretario.getNU_apellidos());
        nuevoUsuario.setcorreo(ventSecretario.getNU_email());
        nuevoUsuario.setRol(ventSecretario.getNU_rol());
        nuevoUsuario.setlogin(dni);
        nuevoUsuario.setpassword(""+(int)(Math.random()*9999));
        nuevoUsuario.mandarCorreoAlta();
        
        EnviarMail mail = new EnviarMail();
        String dest = nuevoUsuario.getcorreo();
        String msj = "Este correo se ha generado automáticamente para "
                + "poner en su conocimiento que ha sido invitado para formar parte del Sistema "
                + "Gestor de Evaluaciones (SGE) que se está desarrollando en la Escuela "
                + "Superior de Informática de Ciudad Real.\n\nPuede acceder a la aplicación "
                + "con la siguiente información:\n\nUSUARIO: "+nuevoUsuario.getlogin()+"\n"
                + "PASSWORD: "+nuevoUsuario.getpassword()+"\n\nMuchas gracias "
                + "por su colaboración.\nEl equipo de desarrollo.\n\n";
        String asunt = "Invitación al SGE";
        if(mail.enviarCorreo(dest, msj, asunt)==0){
            nuevoUsuario.guardar();
            JOptionPane.showMessageDialog(null, "Usuario añadido correctamente.");
            ventSecretario.borrarDatosNU();
        }
    }

    public void actualizar(String dniN) throws ClassNotFoundException, SQLException {
        consultas.actuallizarUsuario(dni, dniN, nombre, apellidos, fecha_nacimiento, sexo,
                estado_civil, telefono, correo, direccion, universidad, estudios, 
                palabras, entidad_bancaria, numero_cuenta);

    }


    private void mandarCorreoAlta() {
        //MANDAR CORREO AL NUEVO USUARIO CON LOGIN Y PASSWORD
    }

    private void cambiarDatos() {
        //CAMBIAR DATOS DE LA BASE DE DATOS
    }

    public void agregarProyecto() throws Exception {        
        Proyecto nuevoProyecto = new Proyecto(consultas);
        nuevoProyecto.setRuta(ventSecretario.getNP_ruta());
        nuevoProyecto.setArea(ventSecretario.getNP_area());        
        nuevoProyecto.setConvocatoria(ventSecretario.getNP_convocatoria());
        nuevoProyecto.setTitulo(ventSecretario.getNP_nombre());
        nuevoProyecto.setEstado("COORDINADOR");        
        nuevoProyecto.guardar(); //al actualizar se genera el id
        JOptionPane.showMessageDialog(null, "Proyecto añadido correctamente.");
    }
    
    public void agregarConvocatoria() throws Exception {
        Convocatoria nuevaConvocatoria = new Convocatoria(consultas);
        nuevaConvocatoria.setNombre(ventSecretario.getNC_nombre());
        nuevaConvocatoria.setRuta(ventSecretario.getNC_ruta());
        nuevaConvocatoria.setOrganizacion(ventSecretario.getNC_org());
        nuevaConvocatoria.guardar(); //al actualizar se genera el id
        nuevaConvocatoria.agregarPlantilla(ventSecretario.getPlantilla());
        JOptionPane.showMessageDialog(null, "Convocatoria añadida correctamente.");
    }

    public void abrirComision(Vector<Usuario> vu) throws Exception {
        Comision nuevaComision = new Comision(consultas);        
        nuevaComision.setConvocatoria(ventSecretario.getAC_conv());
        nuevaComision.setFecha(ventSecretario.getAC_fecha());
        nuevaComision.setEstado("ABIERTA");
        nuevaComision.setExpertos(vu);
        nuevaComision.setLugar(ventSecretario.getAC_lugar());
        nuevaComision.guardar();
        JOptionPane.showMessageDialog(null, "Comisión creada correctamente.");
    }

    public void cerrarComision(int c) throws Exception {
        Comision nuevaComision = new Comision(consultas);
        nuevaComision.setIdComision(c);
        nuevaComision.cerrar();
    }
	
    @Override
    public String toString(){
        return dni;
    }

    private void Realizar_InformeParcial(int id) {
        /*Plantilla plant=coger plantilla por la BBDD a partir de id_proyecto
        /Vector<Criterios>vect =plant.getCriterios();
           int num_criterios=vect.size();
         * int nota_final=0;
         * String contenido="";
        for(int i=0;i<num_criterios;i++){
           System.out.println(vect.get(i).getnombre());
            String cadena=leer.cadena()
           int nota=leer.entero("NOTA:")
          contenido=contenido+cadena+"\nNOTA: "+nota+"\n\n";
         * nota_final=nota_final+nota*(vect.get(i).getporcentaje/100);
        }
         *
         * contenido=contenido+"NOTA FINAL: "+nota_final;
         * String estado=leer.cadena("ESTADO");
         * pedimos a la bbdd la creacion de un informe parcial y luego pedimos su id(id_informe)
         * InformeParcial parcial=new InformeParcial(id_informe, this.dni,estado, contenido, id );
         */
    }

    public Vector<Proyecto> Consultar_proyectos() throws Exception {
        return consultas.listaProyectosAceptados(dni);
    }

    private void Gestiona_invitacion() throws Exception {
        //mostrar lista de invitaciones pendientes.
        int num_lista=leer.entero("¿Que invitacion?");
        String constestacion=leer.cadena("CONTESTACION");
        //actualizamos el estado de la invitacion seleccionada con la contestacion
        
    }

    private void Asignar_adjuntos() throws Exception {
        //Consultar proyectos pendientes de asignacion
        int proyecto=leer.entero("¿QUE PROYECTO?");

    }

    private void Revisar_informe_final() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public Consultas getConsultas() {
        return consultas;
    }

    private void guardar() throws SQLException {
        consultas.añadirUsuario(dni,nombre,apellidos,correo,rol,password);
    }

    public void setdni(String dni) {
        this.dni=dni;
    }

    public int getnota() {
        return nota;
    }

    public String getpalabras() {
        return palabras;
    }

    public int getcuenta() {
        return numero_cuenta;
    }

    public void setnota(int nota) {
        this.nota=nota;
    }

    public void setpalabras(String palabras) {
        this.palabras=palabras;
    }

    void setconsultas(Consultas cons) {
        this.consultas=cons;
    }

    String getRol() {
        return rol;
    }
}
